package com.xuxu.work;

import com.rabbitmq.client.*;
import com.xuxu.util.RabbitConnectionUtil;

import java.io.IOException;

/**
 * 队列 消费者1
 * 用来获取生产者 发送的消息，消费者一共有两个，看看 这两个消费者是如何获取 生产者发送的30条数据的
 */
public class Consumer1 {

    //定义队列名称
    static final String QUEUE_NAME = "work_queue";


    public static void main(String[] args) throws Exception {
        //使用工具类获取连接对象
        Connection connection = RabbitConnectionUtil.getConnection();

        //获取频道对象
        final Channel channel = connection.createChannel();

        //声明频道对象
        /*
            参数一：队列名称
            参数二：是否实例化队列
            参数三：是否独占本次连接
            参数四：是否在不使用的时候删除队列
            参数五：其他队列参数
         */
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);

        //设置一次只处理(读取)一个消息
        channel.basicQos(1);

        //创建消费者对象,重写消息处理方法handleDelivery()
        DefaultConsumer consumer = new DefaultConsumer(channel) {
            /**
             * 重写消息处理方法
             * @param consumerTag   消费者的名称
             * @param envelope  信封(消息包裹) 包含了消息id、消息路由key(routingKey)、交换机、消息重传标志(消息获取失败之后的是否需要重新发送)
             * @param properties 消息属性
             * @param body 消息本体
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                try {
                    //获取消息id
                    System.out.println("消息id是：  " + envelope.getDeliveryTag());

                    //获取路由key(routingKey)
                    System.out.println("路由key是：  " + envelope.getRoutingKey());

                    //获取交换机
                    System.out.println("交换机是：   " + envelope.getExchange());

                    //收到的消息
                    System.out.println("消费者 1 --- 收到的消息是：      " + new String(body, "utf-8"));

                    //睡眠1秒
                    Thread.sleep(1000);

                    //确认消息
                    channel.basicAck(envelope.getDeliveryTag(),false);


                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        //监听消息
        /*
            参数一：队列名称
            参数二：是否自动确认，true的时候，收到消息后会向RabbitMQ回复收到消息了，RabbitMQ会删除队列中已经获取的那条信息；false需要手动确认
            参数三：消费者，消息接受到之后的回调
         */
        channel.basicConsume(QUEUE_NAME,false,consumer);

        //不用关闭资源，需要持续监听，保持程序运行

    }
}
